/**
 * 
 */

/**
 * @author Nguyen Minh Tan
 * 
 */
public class JavaBasics {

	/**
	 * @param args
	 */
	public interface Interfaces {
		public void printOne();

		public void printTwo();

		public int printreturnThere();
	}

	public class ParentClass {
		public ParentClass() {
			System.out.println("Hello , this is Parent Class ^^!");
		}

		public void inramanhinh() {
			System.out.println("In tu lop cha ^^!");
		}
	}

	public class ChildClass extends ParentClass {
		public String testSuper = "Test super Keyword with property ^^!";

		public ChildClass() {
			System.out.println("Hello , this is Child Class ^^!");
		}

		public void inramanhinh() {
			System.out.println("In tu lop con ^^!");
		}
	}

	abstract class AbstractClass {
		// Một lớp abstract thì không thể khởi tạo được đối tượng , mà phải
		// thông qua các lớp con kế thừa nó để khởi tạo đối tượng
		public abstract void abstractmethod();
	}

	public class SubChildClass extends ChildClass implements Interfaces {
		// Lop nay thua ke tu lop ChildClass va thuc thi cac ham viet trong giao
		// dien Interfaces
		public SubChildClass() {
			super();
			System.out.println("Hello , this is SubChild Class ^^!");
			System.out.println(super.testSuper);
		}

		@Override
		public void printOne() {
			// TODO Auto-generated method stub
			System.out.println(1);
		}

		@Override
		public void printTwo() {
			// TODO Auto-generated method stub
			System.out.println(2);
		}

		@Override
		public int printreturnThere() {
			// TODO Auto-generated method stub
			System.out.println(3);
			return 3;
		}

	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JavaBasics javabasics = new JavaBasics();// Khoi tao cua mot lop
		// chinh chua cac lop nhung'
		// ben trong
		TrongFileNhungLaLopPhu trongFileNhungLaLopPhu = new TrongFileNhungLaLopPhu();
		// Tinh da hinh trong Java
		ParentClass parentclass = javabasics.new ParentClass();
		ParentClass childclassone = javabasics.new ChildClass();// Khoi tao the
		// nay cung duoc
		// vi lop
		// ChildClass la
		// lop con cua
		// ParentClass
		parentclass.inramanhinh();// se in ra phuong thuc inramanhinh() cua
		// lop cha
		childclassone.inramanhinh();// se in ra phuong thuc inramanhinh() cua
		// lop con
		SubChildClass subchildclass = javabasics.new SubChildClass();
		subchildclass.printOne();
		subchildclass.printTwo();
		int tandaica = subchildclass.printreturnThere();
		System.out.println(tandaica);
		if (parentclass instanceof ParentClass) {
			System.out
					.println("Doi tuong parentclass la the hien cua lop ParentClass");
		}
	}

}

class TrongFileNhungLaLopPhu {
	public TrongFileNhungLaLopPhu() {
		// Lớp trong cùng 1 file nhưng là lớp phụ như lớp này chỉ có thể là lớp
		// class thường , không dùng được với các bổ từ public , protected ,
		// private mà chỉ có thể dùng các bổ từ là abstract hoặc final
		System.out.print("Trong cung file nhung lai la lop phu\n");
	}
}